﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using ModeloGaleriaNET;
using System.Data.Objects;
using CADs;

namespace GaleriaNET
{
    /// <summary>
    /// Lógica de interacción para ObraFilterWindow.xaml
    /// </summary>
    public partial class ObraFilterWindow : Window
    {
        private List<ObraFilter> filters;
        private bool success;

        public ObraFilterWindow()
        {
            InitializeComponent();
            filters = new List<ObraFilter>();
        }

        public bool Success
        {
            get { return success; }
        }

        public List<ObraFilter> Filters
        {
            get { return filters; }
        }

        private void btCancelar_Click(object sender, RoutedEventArgs e)
        {
            success = false;
            Close();
        }

        private void btAceptar_Click(object sender, RoutedEventArgs e)
        {
            ObraFilter filtro = null;
            string anyo;
            int numAnyo;

            #region Nombre
            if (!string.IsNullOrWhiteSpace(tbNombre.Text))
            {
                filtro = new ObraFilter(@"ToLower(it.nombre) like '%' + @nombreInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("nombreInput", tbNombre.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Autor
            if (!string.IsNullOrWhiteSpace(tbAutor.Text))
            {
                filtro = new ObraFilter(@"ToLower(it.autor) like '%' + @autorInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("autorInput", tbAutor.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Año
            if (!string.IsNullOrWhiteSpace(tbAnyo.Text))
            {
                try
                {
                    anyo = tbAnyo.Text.Replace(" ", "");
                    numAnyo = cbAntesCristo.SelectedIndex == 0 ? Convert.ToInt32(anyo) : Convert.ToInt32(anyo) * -1;

                    switch (cbFiltroAnyo.SelectedIndex)
                    {
                        case 0:
                            filtro = new ObraFilter(@"it.anyo = @anyoInput");
                            break;
                        case 1:
                            filtro = new ObraFilter(@"it.anyo < @anyoInput");
                            break;
                        case 2:
                            filtro = new ObraFilter(@"it.anyo > @anyoInput");
                            break;
                    }
                    filtro.Parameters.Add(new ObjectParameter("anyoInput", numAnyo));
                    filters.Add(filtro);
                }
                catch (Exception)
                { 
                }
            }
            #endregion
            #region Estado
            if (cbEstado.SelectedIndex != -1)
            {
                filtro = new ObraFilter(@"it.estadoConservacion = @estadoInput");
                switch (cbEstado.SelectedIndex)
                {
                    case 0:
                        filtro.Parameters.Add(new ObjectParameter("estadoInput", "original"));
                        break;
                    case 1:
                        filtro.Parameters.Add(new ObjectParameter("estadoInput", "deteriorado"));
                        break;
                    case 2:
                        filtro.Parameters.Add(new ObjectParameter("estadoInput", "restaurado"));
                        break;
                }
                filters.Add(filtro);
            }
            #endregion
            #region Propietario
            if (cbPropietario.ItemsSource != null && cbPropietario.SelectedIndex != -1)
            {
                if (cbPropietario.SelectedIndex == 0)
                {
                    filtro = new ObraFilter(@"NOT EXISTS (select cpo.obra from clientespropietariosobras as cpo where cpo.obra = it.id and cpo.fechaFin IS null)");
                }
                else
                {
                    filtro = new ObraFilter(@"EXISTS (select cpo.obra from clientespropietariosobras as cpo where cpo.cliente = @inputPropietario and cpo.obra = it.id and cpo.fechaFin IS null)");
                    filtro.Parameters.Add(new ObjectParameter("inputPropietario",
                        Convert.ToInt32(cbPropietario.SelectedValue)));
                }
                filters.Add(filtro);
            }
            #endregion
            #region Usuario de alta
            if (cbUsuarioAlta.ItemsSource != null && cbUsuarioAlta.SelectedIndex != -1)
            {
                filtro = new ObraFilter("it.usuarioAlta = @inputAlta");
                filtro.Parameters.Add(new ObjectParameter("inputAlta", 
                    Convert.ToInt32(cbUsuarioAlta.SelectedValue)));
                filters.Add(filtro);
            }
            #endregion
            #region Activo
            if (cbActivo.IsChecked != null)
            {
                if (cbActivo.IsChecked == true)
                    filtro = new ObraFilter(@"it.activo = true");
                else
                    filtro = new ObraFilter(@"it.activo = false");
                
                filters.Add(filtro);
            }
            else
            {
                filtro = new ObraFilter(@"it.activo = true");
                filters.Add(filtro);
            }
            #endregion
            success = true;
            Close();
        }

        private void cbPropietario_GotFocus(object sender, RoutedEventArgs e)
        {
            List<Object> lista;
            Cliente c;
            List<Cliente> aux;

            if (cbPropietario.ItemsSource == null)
            {
                c = new Cliente();
                aux = new List<Cliente>();
                c.Nombre = "-- Sin propietario --";
                c.Id = 0;
                aux.Add(c);
                lista = new List<object>();
                lista.AddRange(aux.Select(cl => new { cl.Id, cl.ApellidosNombre }));
                lista.AddRange(new ClienteCAD().GetClientesIdNombre());
                cbPropietario.ItemsSource = lista;
                cbPropietario.DisplayMemberPath = "ApellidosNombre";
                cbPropietario.SelectedValuePath = "Id";
                cbPropietario.SelectedIndex = -1;
            }
        }

        private void cbUsuarioAlta_GotFocus(object sender, RoutedEventArgs e)
        {
            if (cbUsuarioAlta.ItemsSource == null)
            {
                cbUsuarioAlta.ItemsSource = new UsuarioCAD().GetUsuariosIdNombre();
                cbUsuarioAlta.DisplayMemberPath = "PseudonimoLocal";
                cbUsuarioAlta.SelectedValuePath = "Id";
                cbUsuarioAlta.SelectedIndex = -1;
            }
        }
    }
}
